package com.itheima.tlias.task;

import com.itheima.tlias.mapper.EmpMapper;
import com.itheima.tlias.utils.ALiYunOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 定时清理任务
 *
 * @Author mr.luo
 * @Date 27 4月 2025 14:56
 */
@Slf4j
@Component
public class CleanTask {

    @Autowired
    private ALiYunOssUtil ossUtil;

    @Autowired
    private EmpMapper empMapper;

    @Scheduled(cron = "0 0 3 1/1 * ? ")
    public void clean() throws Exception {
        log.info("[CleanTask]清理任务开始执行...");

        // 查询数据库所有员工的图片文件
        List<String> empPhotoList = empMapper.selectEmpPhotoList();
        log.info("数据库员工图片文件有：{}", empPhotoList);

        // 查询所有存储桶下的文件
        List<String> objectList = ossUtil.getObjectList();
        log.info("存储桶下的文件有：{}", objectList);


        // 将桶的文件名转换为别名（去掉路径部分）
        List<String> changeName = objectList.stream()
                .map(s -> s.substring(s.lastIndexOf("/") + 1)) // 提取文件名（去掉路径）
                .collect(Collectors.toList());
        log.info("存储桶下的别名文件名有：{}", changeName);

        // 筛选出数据库中不包含桶里的文件名
        List<String> nameList = changeName.stream()
                .filter(item -> empPhotoList.stream()
                        .noneMatch(empPhoto -> empPhoto.contains(item))) // 数据库中没有对应的文件
                .collect(Collectors.toList());
        log.info("不包含的别名图片文件有：{}", nameList);

        // 最终需要删除的文件
        List<String> finalNameList = objectList.stream()
                .filter(object -> nameList.stream()
                        .anyMatch(name -> object.endsWith(name))) // 匹配需要删除的文件
                .collect(Collectors.toList());

        if (finalNameList.isEmpty()) {
            log.info("[CleanTask]没有需要清理的图片文件...");
            return;
        }

        log.info("[CleanTask]需要清理的图片文件有：{}", finalNameList);
        ossUtil.deleteObject(finalNameList);
        log.info("[CleanTask]清理任务执行完毕...");
    }
}